package main

import (
	"fmt"
	"regexp"
)

func main() {
	/*
		2.regexp 包
			Go在处理正则表达式时主要使用 regexp 包，包中实现了正则表达式的查找、替换 和 模式匹配功能。
		（1）MatchString 函数
			接收一个要查找的 正则表达式 和 目标字符串，并根据匹配结果返回 true 和 false
				func MatchString(pattern string, s string) (matched bool, err error)

		（2）FindStringIndex 函数
			接收一个目标字符串，并返回第一个匹配的 起始位置 和 结束位置
				func (re *Regexp) FindStringIndex(s string) (loc []int)

			由于FindStringIndex函数是Regexp结构体的成员函数，需要对正则表达式进行编译，编译成功后方能使用。通常使用Compile或MustCompile函数进行编译。
			·Compile函数：若正则表达式未通过编译，则返回错误。
			·MustCompile函数：若正则表达式未通过编译，则引发panic。

		（3）ReplaceAllString 函数
			返回第一个参数的拷贝，将第一个参数中所有re的匹配结果都替换为repl。
				func (re ＊Regexp) ReplaceAllString(src, repl string) string

		3.知识拓展：
			（1）E-mail地址
				^\w+([-+.]\w+)＊@\w+([-.]\w+)＊\.\w+([-.]\w+)＊$

			（2）URL地址
				^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-])\/?$

			（3）匹配首尾空白字符的正则表达式
				^\s|\s$

			（4）手机号码
				^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$

			（5）18位身份证号码（数字、字母x结尾）
				^((\d{18})|([0-9x]{18})|([0-9X]{18}))$

			（6）电话号码
				^(\d{3,4}-)?\d{7,8}$

			（7）账号是否合法（5～16字节，允许字母、数字、下划线，以字母开头）
				^[a-zA-Z][a-zA-Z0-9_]{4,15}$

			（8）一年的12个月（01～09和1～12）
				^(0?[1-9]|1[0-2])$

			（9）日期格式（2018-01-01只做粗略匹配，格式不限制，二月有30天等）
				^\d{4}-\d{1,2}-\d{1,2}$

			（10）一个月的31天（01～09和1～31）
				^((0?[1-9])|((1|2)[0-9])|30|31)$

			（11）IP地址
				^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]
				[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

	*/
	targetString := "hello world"
	//matchString := "hello"
	matchString := "(?i)hello" //让字符串开头匹配时不区分大小写

	/*
		MatchString 函数
	*/
	match, err := regexp.MatchString(matchString, targetString)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(match)

	/*
		FindStringIndex 函数
	*/
	re := regexp.MustCompile(`(\w)+`)
	res := re.FindStringIndex(targetString)
	fmt.Println(res)

	/*
		对于目标字符串“hello world”，通过ReplaceAllString函数匹配其中的“o”字符并将其替换为“O”
	*/
	re1 := regexp.MustCompile(`o`)
	res1 := re1.ReplaceAllString(targetString, "O")
	fmt.Println(res1)

}
